package com.zhucan.elastics.application.command.assembler;

import org.springframework.data.domain.Page;

import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author: zhuCan
 * @date: 2019/8/29
 * @description: 使用mapStruct 构建 实体类 ,dto ,command 的转换接口
 */
public interface MapStruct<ENTITY, COMMAND, DTO> {

  /**
   * command 转 实体类
   *
   * @param command
   * @return
   */
  ENTITY convertEntity(COMMAND command);

  /**
   * 实体类 转 dto
   *
   * @param entity
   * @return
   */
  DTO convertDTO(ENTITY entity);

  /**
   * command 集合 转实体类集合
   *
   * @param commands
   * @return
   */
  default List<ENTITY> convertEntities(Collection<COMMAND> commands) {
    return commands.stream().map(this::convertEntity).collect(Collectors.toList());
  }

  /**
   * 实体 集合 转 dto集合
   *
   * @param entities
   * @return
   */
  default List<DTO> convertDTOs(Collection<ENTITY> entities) {
    return entities.stream().map(this::convertDTO).collect(Collectors.toList());
  }

  /**
   * 实体分页对象转 dto分页对象
   *
   * @param entityPage
   * @return
   */
  default Page<DTO> convertDtoPage(Page<ENTITY> entityPage) {
    return entityPage.map(this::convertDTO);
  }
}
